package com.news_back.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.news_back.common.JwtUtil;
import com.news_back.common.Result;
import com.news_back.entity.User;
import com.news_back.service.IUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author yg
 * @since 2024-03-02
 */
@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {

    @Autowired
    private IUserService userService;

    @Autowired
    private JwtUtil jwtUtil;

    @Autowired
    private PasswordEncoder passwordEncoder;

    @PostMapping("/login")
    public Result<Map<String,Object>> login(@RequestBody User user){
        Map<String,Object> data = userService.login(user);
        if (data!=null){
            return Result.success(data);
        }
        return Result.success("过来了");
    }

    @PostMapping("/register")
    public Result<?> addUser (@RequestBody User user){
        try{
            log.info(String.valueOf(user));
            user.setPassword(passwordEncoder.encode(user.getPassword()));//即使设置的密码是一样的，加密后的密文也不一样
            int sortId=userService.getOne(new QueryWrapper<User>().orderByDesc("id").last("limit 1")).getId()+1;
            boolean flag=userService.save(user);
            if(flag){
                return Result.success("新增用户成功");
            }else{
                return Result.fail(50000,"新增用户失败1"+user.getUsername());
            }
        }catch (Exception e){
            log.info("新增用户失败2"+user.getUsername()+e);
            return Result.fail(50000,"新增用户失败2"+e);
        }
    }

    //根据token获取到用户信息，前端只需要调用这个方法就行，不用传任何参数，这里是直接后去header中的token，token的封装可以看JwtUtil文件，除了用户的密码信息，其他信息都包含在里面
    //用户前端页面可以自动执行这个方法来判断token是否过期，如果这个获取不到用户信息就说明token到期了，前端如果到期了可以执行this.$router.push("/"),这个方法调到首页面
    @GetMapping("/getUserInfo")
    public Result<Map<String,Object>> getUserInfo(@RequestHeader("X-Token") String token){
        log.info(token);
        User loginUser = null;
        try {
            loginUser = jwtUtil.parseToken(token, User.class);
        }catch (Exception e){
            e.printStackTrace();
        }
        if (loginUser!=null) {
            log.info(String.valueOf(loginUser));
            //User loginUser = JSON.parseObject(JSON.toJSONString(obj),User.class);不要了，这是从redis中取数据
            Map<String, Object> data = new HashMap<>();
            data.put("name", loginUser.getUsername());
            return Result.success(data);
        }
        return Result.fail(20000,"登录信息无效，请重新登录1");
    }
}
